package main

import (
	"encoding/json"
	"io/ioutil"
)

// Application 应用结构体
type Application struct {
	JarName string `json:"jarName"`
	Port    int    `json:"port"`
	Path    string `json:"path"`
	LogPath string `json:"logPath"`
}

// Front 前端应用结构体
type Front struct {
	Name string `json:"name"`
	Path string `json:"path"`
}

// Config 配置结构体
type Config struct {
	Applications  []Application `json:"applications"`
	Frontends     []Front       `json:"frontends"`
	NginxConfPath string        `json:"nginxConfPath"`
}

// LoadApplications 从配置文件加载应用信息
func LoadApplications(configPath string) ([]Application, error) {
	config, err := LoadConfig(configPath)
	if err != nil {
		return nil, err
	}
	return config.Applications, nil
}

// LoadFrontends 从配置文件加载前端应用信息
func LoadFrontends(configPath string) ([]Front, error) {
	config, err := LoadConfig(configPath)
	if err != nil {
		return nil, err
	}
	return config.Frontends, nil
}

// LoadConfig 从配置文件加载所有配置
func LoadConfig(configPath string) (*Config, error) {
	data, err := ioutil.ReadFile(configPath)
	if err != nil {
		return nil, err
	}

	var config Config
	err = json.Unmarshal(data, &config)
	if err != nil {
		return nil, err
	}

	return &config, nil
}

// SaveApplications 保存应用信息到配置文件
func SaveApplications(apps []Application, configPath string) error {
	// 先加载现有配置
	config, err := LoadConfig(configPath)
	if err != nil {
		return err
	}

	// 更新应用配置
	config.Applications = apps

	// 保存配置
	return SaveConfig(config, configPath)
}

// SaveConfig 保存配置到文件
func SaveConfig(config *Config, configPath string) error {
	data, err := json.MarshalIndent(config, "", "  ")
	if err != nil {
		return err
	}

	err = ioutil.WriteFile(configPath, data, 0644)
	if err != nil {
		return err
	}

	return nil
}

// FindApplicationByPort 根据端口查找应用
func FindApplicationByPort(apps []Application, port int) *Application {
	for _, app := range apps {
		if app.Port == port {
			return &app
		}
	}
	return nil
}

// FindFrontendByName 根据名称查找前端应用
func FindFrontendByName(frontends []Front, name string) *Front {
	for _, front := range frontends {
		if front.Name == name {
			return &front
		}
	}
	return nil
}

// GetNginxConfPath 获取 Nginx 配置路径
func GetNginxConfPath(configPath string) (string, error) {
	config, err := LoadConfig(configPath)
	if err != nil {
		return "", err
	}
	return config.NginxConfPath, nil
}
